package com.huantai.common.util;

import java.text.MessageFormat;

import com.huantai.common.exception.SystemException;

/**
 * String 工具类
 * 
 * @author Ma Chao
 * @version 2018年4月17日 下午5:56:21
 */
public final class StringUtil {
    /** 不允许使用对象来调用工具类的方法 */
    private StringUtil() {}

    /**
     * 判断传入的字符串是不是空字符串""、空格" "、null、字符串"null"、字符串" Null "
     * 
     * @param str 要判断的字符串
     * @return boolean
     */
    public static boolean isEmpty(String str) {
        boolean result = false;
        if (null == str) {
            return true;
        }
        str = str.trim();
        if (str.length() <= 0 || "null".equalsIgnoreCase(str)) {
            result = true;
        }
        return result;
    }

    /**
     * 字符串省略截取：字符串截取到指定长度size+...的形式
     *
     * @param subject 需要处理的字符串
     * @param size 截取的长度
     * @return 处理后的字符串
     */
    public static String subStringOmit(String subject, int size) {
        if (!isEmpty(subject) && subject.length() > size) {
            subject = subject.substring(0, size) + "...";
        }
        return subject;
    }

    /**
     * 将字符串首字母转大写
     * 
     * @param str 需要处理的字符串
     * @return 处理后的字符串
     */
    public static String upperFirstChar(String str) {
        if (isEmpty(str)) {
            return "";
        }
        char[] cs = str.toCharArray();
        if ((cs[0] >= 'a') && (cs[0] <= 'z')) {
            cs[0] -= (char) 0x20;
        }
        return String.valueOf(cs);
    }

    /**
     * 将字符串首字母转小写
     * 
     * @param str 需要处理的字符串
     * @return 处理后的字符串
     */
    public static String lowerFirstChar(String str) {
        if (isEmpty(str)) {
            return "";
        }
        char[] cs = str.toCharArray();
        if ((cs[0] >= 'A') && (cs[0] <= 'Z')) {
            cs[0] += (char) 0x20;
        }
        return String.valueOf(cs);
    }

    /**
     * 字符串 str 是否包含 searchStr
     * 
     * @param str 要查询的字符串
     * @param searchStr 关键字
     * @return boolean
     */
    public static boolean contains(String str, String searchStr) {
        if (str == null || searchStr == null) {
            return false;
        }
        return str.indexOf(searchStr) >= 0;
    }

    /**
     * 格式化文本信息
     * 
     * @param pattern 表达式
     * @param arguments 参数
     * @return 格式化完毕的字符串
     * @throws SystemException
     */
    public static String formatMessage(String pattern, Object... arguments){
        String message = "";
        if (arguments instanceof Object[]) {
            for (int i = 0; i < arguments.length; i++) {
                if (arguments[i] == null) {
                    arguments[i] = "";
                }
            }
        }
        try {
            message = MessageFormat.format(
                    pattern.replaceAll("(?<!('|\\{|\\}))'(?!('|\\{|\\}))", "''"), arguments);
        } catch (Exception e) {
            throw new SystemException("处理字符串失败！", e);
        }
        return message;
    }

    /**
     * 替换String中最左边第一个出现的sub字符为with字符
     * 
     * @param s 要处理的字符串
     * @param sub 要被替换的字符
     * @param with 替换后的字符
     * @return 替换后的字符串
     */
    public static String replaceFirst(String s, char sub, char with) {
        if (s == null) {
            return null;
        }
        int index = s.indexOf(sub);
        if (index == -1) {
            return s;
        }
        char[] str = s.toCharArray();
        str[index] = with;
        return new String(str);
    }

    /**
     * 替换String中最右边第一个出现的sub字符为with字符
     * 
     * @param s 要处理的字符串
     * @param sub 要被替换的字符
     * @param with 替换后的字符
     * @return 替换后的字符串
     */
    public static String replaceLast(String s, char sub, char with) {
        if (s == null) {
            return null;
        }

        int index = s.lastIndexOf(sub);
        if (index == -1) {
            return s;
        }
        char[] str = s.toCharArray();
        str[index] = with;
        return new String(str);
    }
}
